package czk.jvm.lecture.gc;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @Author:ChenZhangKun
 * @Date: 2022/11/5 14:24
 */
public class ThreadPoolGcTest {
    public static void main(String[] args) {
        method();
        // method里面的线程池对象会不会被回收
        /**
         * 因为线程池里面有活跃线程，活跃线程是 GC Root。这个活跃线程，其实就是 Woker 对象，
         * 它是 ThreadPoolExecutor 类的一个内部类，持有外部类 ThreadPoolExecutor 的引用。所以，executorService 对象是“可达”，它不可以被回收
         * 成员内部类编译后，内部类的构造方法会持有外部类的对象 可以编译一个内部类来实现
         * 而静态内部类没有持有外部类的对象，所以静态内部类不会影响外部类的回收->静态内部类不持有外部类的引用。
         *
         */
        System.gc();
    }

    private static void method() {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        executorService.submit(() -> {
            System.out.println("czk");
        });
        System.out.println("executorService=" + executorService);
    }
}
